﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace itau.imnk.transcritor
{
    public class GeradorRelatorio
    {
        private const string FORMATO_DATA_RELATORIO = "dd/MM/yyyy hh:mm:ss";
        private const int LENGTH_NOME_CURVA_IM = 81;
        private const int LENGTH_NOME_CURVA_NK = 51;
        private const int LENGTH_MSG_ERRO = 100;

        private string _enderecoArquivo;
        private Queue<string> _mensagemQueue;

        public Queue<string> MensagemQueue
        {
            get
            {
                return _mensagemQueue;
            }
        }

        public GeradorRelatorio()
        {
            _enderecoArquivo = ObterEnderecoArquivo();
            _mensagemQueue = new Queue<string>();

            AdicionarCabecalhoRelatorio();
        }

        public void GravarRelatorio()
        {
            using (StreamWriter streamWriter = File.CreateText(_enderecoArquivo))
            {
                while (_mensagemQueue.Count > 0)
                {
                    streamWriter.WriteLine(_mensagemQueue.Dequeue());
                }

                streamWriter.WriteLine(string.Empty);
                streamWriter.WriteLine(string.Format("Última transcrição: {0}", DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss")));
            }

            AdicionarCabecalhoRelatorio();
        }

        private void AdicionarCabecalhoRelatorio()
        {
            string cabecalho = ObterCabecalhoRelatorio();

            _mensagemQueue.Enqueue(cabecalho);
            _mensagemQueue.Enqueue(string.Empty.PadRight(cabecalho.Length, '-'));
        }

        private string ObterCabecalhoRelatorio()
        {
            string cabecalho;
            cabecalho = "Curva IM".PadRight(LENGTH_NOME_CURVA_IM, ' ');
            cabecalho += "Última Alteração".PadRight(FORMATO_DATA_RELATORIO.Length + 1, ' ');
            cabecalho += "Curva NK".PadRight(LENGTH_NOME_CURVA_NK, ' ');
            cabecalho += "Última Execução".PadRight(FORMATO_DATA_RELATORIO.Length + 1, ' ');
            cabecalho += "Resultado".PadRight(LENGTH_MSG_ERRO, ' ');

            return cabecalho;
        }

        public void AdicionarLinhaRelatorio(string nomeCurva, DateTime ultimaAlteracao, string nomeYield, DateTime ultimaExecucao, string mensagem)
        {
            string linhaFormatada;
            linhaFormatada = nomeCurva.PadRight(LENGTH_NOME_CURVA_IM, ' ');
            linhaFormatada += string.Concat(ultimaAlteracao.ToString(FORMATO_DATA_RELATORIO), " ");
            linhaFormatada += nomeYield.PadRight(LENGTH_NOME_CURVA_NK, ' ');
            linhaFormatada += string.Concat(ultimaAlteracao.ToString(FORMATO_DATA_RELATORIO), " ");
            linhaFormatada += mensagem;

            _mensagemQueue.Enqueue(linhaFormatada);
        }

        public void AdicionarLinhaRelatorio(string nomeCurva, string nomeYield, string mensagem)
        {
            string linhaFormatada;
            linhaFormatada = nomeCurva.PadRight(LENGTH_NOME_CURVA_IM, ' ');
            linhaFormatada += string.Empty.PadRight(FORMATO_DATA_RELATORIO.Length + 1, ' ');
            linhaFormatada += nomeYield.PadRight(LENGTH_NOME_CURVA_NK, ' ');
            linhaFormatada += string.Empty.PadRight(FORMATO_DATA_RELATORIO.Length + 1, ' ');
            linhaFormatada += mensagem;

            _mensagemQueue.Enqueue(linhaFormatada);
        }

        private string ObterEnderecoArquivo()
        {
            return System.Configuration.ConfigurationSettings.AppSettings["ARQUIVO_RELATORIO"];
        }
    }
}
